; This module is common to all of the examples.
; It contains all of the interrupt vector declarations and
; the first level interrupt servicing (register save, call subroutine,
; clear interrupt source, restore registers, return)
; Suspend and Resume are handled totally in this module
;
; A Reset sends us to Program space location 0
CSEG AT 0 ; Code space
USING 0 ; Reset forces Register Bank 0
LJMP Reset
;
; The interrupt vector table is also located here
; EZ-USB has two levels of USB interrupts:
; 1-the main level is described in this table (at ORG 43H)
; 2-there are 21 sources of USB interrupts and these are described in USB_ISR
; This means that two levels of acknowledgement and clearing will be required
; LJMP INT0_ISR ; Features not used are commented out
; ORG 0BH
; LJMP Timer0_ISR
; ORG 13H
; LJMP INT1_ISR
; ORG 1BH
; LJMP Timer1_ISR
; ORG 23H
; LJMP UART0_ISR
; ORG 2BH
; LJMP Timer2_ISR
; ORG 33H
; LJMP WakeUp_ISR
; ORG 3BH
; LJMP UART1_ISR
ORG 43H
LJMP USB_ISR ; Auto Vector will replace byte 45H
; ORG 4BH
; LJMP I2C_ISR
; ORG 53H
; LJMP INT4_ISR
; ORG 5BH
; LJMP INT5_ISR
; ORG 63H
; LJMP INT6_ISR
ORG 0E0H ; Keep out of the way of dScope monitor
; If you are not using dScope then this memory hole
; may be used for useful routines.
ORG 100H
USB_ISR:LJMP SUDAV_ISR
DB 0 ; Pad entries to 4 bytes
LJMP SOF_ISR
DB 0
LJMP SUTOK_ISR
DB 0
LJMP Suspend_ISR
DB 0
LJMP USBReset_ISR
DB 0
LJMP Reserved
DB 0
; LJMP EP0In_ISR ; Endpoint Interrupts are not used in these examples
; DB 0 ; Comment out features not used
; LJMP EP0Out_ISR
; DB 0
; LJMP EP1In_ISR
; DB 0
; LJMP EP1Out_ISR
; DB 0
; LJMP EP2In_ISR
; DB 0
; LJMP EP2Out_ISR
; DB 0
; LJMP EP3In_ISR
; DB 0
; LJMP EP3Out_ISR
; DB 0
; LJMP EP4In_ISR
; DB 0
; LJMP EP4Out_ISR
; DB 0
; LJMP EP5In_ISR
; DB 0
; LJMP EP5Out_ISR
; DB 0
; LJMP EP6In_ISR
; DB 0
; LJMP EP6Out_ISR
; DB 0
; LJMP EP7In_ISR
; DB 0
; LJMP EP7Out_ISR
; End of Interrupt Vector tables
; When a feature is used insert the required interrupt processing here
; The example use only used Endpoints 0 and 1 and also SOF for timing
Reserved:
INT0_ISR:
Timer0_ISR:
INT1_ISR:
Timer1_ISR:
UART0_ISR:
Timer2_ISR:
UART1_ISR:
I2C_ISR:
INT4_ISR:
INT5_ISR:
INT6_ISR:
SUTOK_ISR:
EP0In_ISR:
EP0Out_ISR:
EP1In_ISR:
EP1Out_ISR:
EP2In_ISR:
EP2Out_ISR:
EP3In_ISR:
EP3Out_ISR:
EP4In_ISR:
EP4Out_ISR:
EP5In_ISR:
EP5Out_ISR:
EP6In_ISR:
EP6Out_ISR:
EP7In_ISR :
EP7Out_ISR:
Not_Used: ; Should not get any of these
RETI
ClearINT2: ; Tell the hardware that we're done
MOV A, EXIF
CLR ACC.4 ; Clear the Interrupt 2 bit
MOV EXIF, A
RET
USBReset_ISR: ; Bus has been Reset, move to DEFAULT state
PUSH ACC
CLR Configured
CALL ClearINT2
; No need to clear source of interrupt
POP ACC
RETI
Suspend_ISR: ; SIE detected an Idle bus
PUSH ACC
MOV A, PCON
ORL A, #1
MOV PCON, A ; Go to sleep!
NOP
NOP ; Wake up here due to a USBResume
NOP
CALL ClearINT2
POP ACC
RETI
WakeUp_ISR: ; Not using external WAKEUP in these examples
; So this must be due to a USBResume
CLR EICON.4 ; Clear the wakeup interrupt source
RETI
SUDAV_ISR: ; A Setup packet has been received
PUSH PSW ; Save Registers before the service routine
PUSH ACC
PUSH DPL
PUSH DPH
CALL ServiceSetupPacket
CALL ClearINT2
; Clear the source of the interrupt
MOV A, #00000001b
ExitISR:MOV DPTR, #USBIRQ
MOVX @DPTR, A
POP DPH ; Restore Registers
POP DPL
POP ACC
POP PSW
RETI
SOF_ISR: ; A Start-Of-Frame packet has been received
PUSH PSW ; Save Registers before the service routine
PUSH ACC
PUSH DPL
PUSH DPH
CALL ServiceTimerRoutine
CALL ClearINT2
; Clear the source of the interrupt
MOV A, #00000010b
JMP ExitISR